package io.gitee.caoxiaoyu97;

import net.sf.oval.Validator;
import net.sf.oval.configuration.annotation.AbstractAnnotationCheck;
import net.sf.oval.context.OValContext;
import net.sf.oval.exception.OValException;
import org.apache.commons.lang3.ObjectUtils;

import java.lang.reflect.Field;

/*********************************************************
 * 文件名称：CertNoCheckImpl.java
 * 功能说明：个人身份证校验
 * 开发人员 @author：caoxy31978
 * 开发时间 @date：2022-04-20 19:24
 * 修改记录：程序版本  修改日期  修改人员  修改单号  修改说明
 *********************************************************/
public class CertNoCheckImpl  extends AbstractAnnotationCheck<CertNoCheck> {
    /**
     * 
     * @param validatedObject	用于验证值的对象/bean，对于静态字段或方法，这是类
     * @param valueToValidate	被校验的数据的值，可能为空
     * @param context	验证上下文（例如字段、构造函数参数或方法参数）
     * @param validator	调用验证程序
     * @return
     * @throws OValException
     */
    @Override
    public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context,
                               Validator validator) throws OValException {
        if (ObjectUtils.isEmpty(valueToValidate)){
            return true;
        }
        String simpleName = context.toStringUnqualified();
        if (simpleName.equals("address1")){
            Class<?> aClass = validatedObject.getClass();
            try {
                Field name = aClass.getDeclaredField("name");
                name.setAccessible(true);
                Object o = name.get(validatedObject);
                if (o == null){
                    return true;
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        if (!(valueToValidate instanceof String)){
            this.setErrorCode("1234");
            this.setMessage("个人身份证校验必须为String类型数据");
            return false;
        }
        // throw new RuntimeException("个人身份证格式校验失败");
        return true;
    }
}